import pandas as pd
from sqlalchemy import create_engine, text


def excel_to_mysql(excel_path, db_config, table_name):
    """
    将Excel数据插入MySQL数据库，其中style_name字段为第1列和第3列的拼接
    :param excel_path: Excel文件路径
    :param db_config: 数据库配置字典
    :param table_name: 目标表名
    :return: 插入记录数
    """
    try:
        # 1. 读取Excel文件并处理中文表头
        df = pd.read_excel(excel_path, sheet_name=0, header=0, engine="openpyxl")
        print(f"读取到 {len(df)} 行数据")

        # 2. 动态拼接style_name字段（第1列和第3列）
        if len(df.columns) < 3:
            raise ValueError("Excel文件至少需要3列数据")

        col1 = df.columns[0]  # 第1列（索引0）
        col3 = df.columns[2]  # 第3列（索引2）

        # 处理缺失值和数据类型转换
        df['style_name'] = df[col1].astype(str).fillna("未知") + "_" + df[col3].astype(str).fillna("无码")

        # 3. 动态生成插入字段列表（排除style_name避免重复）
        columns = [text(f"`{col}`") for col in df.columns if col != 'style_name']
        columns.append(text("`style_name`"))  # 确保style_name最后插入

        # 4. 构建参数化VALUES列表
        values = []
        for _, row in df.iterrows():
            # 动态生成各字段值（自动转义特殊字符）
            row_values = [
                text(f"`{col}`") for col in df.columns if col != 'style_name'
            ]
            row_values.append(text(f"`{row['style_name']}`"))
            values.append(text("(" + ",".join(row_values) + ")"))

        # 5. 创建数据库连接（自动重试3次）
        engine = create_engine(
            f"mysql+pymysql://{db_config['user']}:{db_config['password']}@"
            f"{db_config['host']}:{db_config.get('port', 3306)}/{db_config['database']}",
            connect_args={"retry_connect": True, "max_retries": 3}
        )

        # 6. 执行批量插入（使用参数化查询）
        insert_sql = text(
            f"INSERT INTO {table_name} ({','.join(columns)}) VALUES "
            + ",".join(values)
        )

        with engine.connect() as conn:
            result = conn.execute(insert_sql)
            print(f"成功插入 {result.rowcount} 行数据")

        return result.rowcount

    except Exception as e:
        print(f"发生错误: {str(e)}")
        return 0


if __name__ == "__main__":
    # 配置参数
    db_config = {
        "host": "127.0.0.1",
        "user": "root",
        "password": "",
        "database": "xiaocheng",
        'port': 3306,
    }

    # 执行导入
    inserted_rows = excel_to_mysql(
        excel_path="data.xlsx",
        db_config=db_config,
        table_name="data_kuaimai_guangban"
    )

    print(f"总计插入 {inserted_rows} 行数据")